#!/usr/bin/env perl
require 5.008;
use warnings;
use strict;

unshift(@INC, '.');
require qpdf_test_helpers;

chdir("qpdf") or die "chdir testdir failed: $!\n";

require TestDriver;

cleanup();

my $td = new TestDriver('attachments');

my $n_tests = 37;

open(F, ">auto-txt") or die;
print F "from file";
close(F);
$td->runtest("attachments",
             {$td->COMMAND => "test_driver 76 minimal.pdf auto-txt"},
             {$td->FILE => "test76.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("show attachment",
             {$td->COMMAND => "qpdf --show-attachment=att1 a.pdf"},
             {$td->STRING => "from file", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "test76.pdf"});
$td->runtest("list attachments",
             {$td->COMMAND => "qpdf --list-attachments a.pdf"},
             {$td->FILE => "test76-list.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments verbose",
             {$td->COMMAND => "qpdf --list-attachments --verbose a.pdf"},
             {$td->FILE => "test76-list-verbose.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("attachments json",
             {$td->COMMAND => "qpdf --json=1 --json-key=attachments a.pdf"},
             {$td->FILE => "test76-json.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("remove attachment (test_driver)",
             {$td->COMMAND => "test_driver 77 test76.pdf"},
             {$td->STRING => "test 77 done\n", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "test77.pdf"});
$td->runtest("remove attachment (cli)",
             {$td->COMMAND => "qpdf --remove-attachment=att2 test76.pdf" .
                  " --static-id --qdf --verbose b.pdf"},
             {$td->FILE => "remove-attachment.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "b.pdf"},
             {$td->FILE => "test77.pdf"});
$td->runtest("show missing attachment",
             {$td->COMMAND => "qpdf --show-attachment=att2 b.pdf"},
             {$td->STRING => "qpdf: attachment att2 not found\n",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("remove missing attachment",
             {$td->COMMAND => "qpdf --remove-attachment=att2 b.pdf c.pdf"},
             {$td->STRING => "qpdf: attachment att2 not found\n",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);

$td->runtest("add attachment: bad creation date",
             {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
                  " --add-attachment auto-txt --creationdate=potato --"},
             {$td->REGEXP => ".*potato is not a valid PDF timestamp.*",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachment: bad mod date",
             {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
                  " --add-attachment auto-txt --moddate=potato --"},
             {$td->REGEXP => ".*potato is not a valid PDF timestamp.*",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachment: bad mod date",
             {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
                  " --add-attachment auto-txt --mimetype=potato --"},
             {$td->REGEXP =>
                  ".*mime type should be specified as type/subtype.*",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachment: trailing slash",
             {$td->COMMAND => "qpdf minimal.pdf a.pdf" .
                  " --add-attachment --"},
             {$td->REGEXP => ".*add attachment: no file specified.*",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);

foreach my $i (qw(1 2 3))
{
    open(F, ">auto-$i") or die;
    print F "attachment $i";
    close(F);
}
my @dates = ("--creationdate=D:20210210091359-05'00'",
             "--moddate=D:20210210141359Z");
$td->runtest("add attachments",
             {$td->COMMAND =>
                  [qw(qpdf minimal.pdf a.pdf --no-original-object-ids),
                   qw(--verbose --static-id --qdf),
                   qw(--add-attachment ./auto-1), @dates,
                   qw(--mimetype=text/plain --),
                   qw(--add-attachment ./auto-2 --key=auto-Two), @dates, '--',
                   qw(--add-attachment ./auto-3 --filename=auto-Three.txt),
                   @dates, '--description=two words', '--']},
             {$td->FILE => "add-attachments-1.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments",
             {$td->COMMAND => "qpdf --list-attachments a.pdf --verbose"},
             {$td->FILE => "list-attachments-1.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "a.pdf"},
             {$td->FILE => "add-attachments-1.pdf"},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachments: duplicate",
             {$td->COMMAND =>
                  "qpdf a.pdf b.pdf --verbose --add-attachment ./auto-1 --"},
             {$td->FILE => "add-attachments-duplicate.out",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachments: replace",
             {$td->COMMAND =>
                  [qw(qpdf a.pdf b.pdf --no-original-object-ids),
                   qw(--verbose --static-id --qdf),
                   qw(--add-attachment ./auto-2 --key=auto-1 --replace),
                   @dates, '--']},
             {$td->FILE => "add-attachments-2.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments",
             {$td->COMMAND => "qpdf --list-attachments b.pdf --verbose"},
             {$td->FILE => "list-attachments-3.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "b.pdf"},
             {$td->FILE => "add-attachments-2.pdf"},
             $td->NORMALIZE_NEWLINES);
$td->runtest("copy attachments",
             {$td->COMMAND =>
                  "qpdf --verbose --no-original-object-ids" .
                  " --static-id --qdf minimal.pdf b.pdf" .
                  " --copy-attachments-from a.pdf --"},
             {$td->FILE => "copy-attachments-1.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments",
             {$td->COMMAND => "qpdf --list-attachments b.pdf --verbose"},
             {$td->FILE => "list-attachments-1.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "b.pdf"},
             {$td->FILE => "add-attachments-1.pdf"},
             $td->NORMALIZE_NEWLINES);
$td->runtest("copy attachments: duplicate",
             {$td->COMMAND =>
                  "qpdf --verbose --no-original-object-ids" .
                  " --static-id --qdf a.pdf c.pdf" .
                  " --copy-attachments-from b.pdf --"},
             {$td->FILE => "copy-attachments-duplicate.out",
                  $td->EXIT_STATUS => 2},
             $td->NORMALIZE_NEWLINES);
$td->runtest("copy attachments: prefix",
             {$td->COMMAND =>
                  "qpdf --verbose --no-original-object-ids" .
                  " --static-id --qdf a.pdf c.pdf" .
                  " --copy-attachments-from b.pdf --prefix=1- --"},
             {$td->FILE => "copy-attachments-2.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments",
             {$td->COMMAND => "qpdf --list-attachments c.pdf --verbose"},
             {$td->FILE => "list-attachments-2.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->FILE => "c.pdf"},
             {$td->FILE => "copy-attachments-2.pdf"},
             $td->NORMALIZE_NEWLINES);
$td->runtest("add attachments: current date",
             {$td->COMMAND =>
                  [qw(qpdf minimal.pdf a.pdf --encrypt u o 256 --),
                   qw(--verbose --add-attachment ./auto-1 --)]},
             {$td->FILE => "add-attachments-3.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("list attachments",
             {$td->COMMAND =>
                  "qpdf --password=u --list-attachments a.pdf --verbose",
                  $td->FILTER => "perl filter-attachment-date.pl"},
             {$td->FILE => "list-attachments-4.out", $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
# The object to show here is the one in list-attachments-4.out
$td->runtest("check dates",
             {$td->COMMAND => "qpdf --show-object=6 a.pdf --password=u"},
             {$td->REGEXP => ".*CreationDate \\(D:\\d+.*ModDate \\(D:\\d+.*",
                  $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("remove multiple attachments",
             {$td->COMMAND =>
                  "qpdf --verbose --static-id add-attachments-1.pdf a.pdf" .
                  " --remove-attachment=auto-1 --remove-attachment=auto-Two"},
             {$td->FILE => "remove-multiple-attachments.out",
                  $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->COMMAND => "qpdf-test-compare a.pdf remove-multiple-attachments.pdf"},
             {$td->FILE => "remove-multiple-attachments.pdf", $td->EXIT_STATUS => 0});
$td->runtest("remove multiple attachments (json)",
             {$td->COMMAND =>
                  "qpdf --job-json-file=remove-multiple-attachments.json"},
             {$td->FILE => "remove-multiple-attachments-json.out",
                  $td->EXIT_STATUS => 0},
             $td->NORMALIZE_NEWLINES);
$td->runtest("check output",
             {$td->COMMAND => "qpdf-test-compare b.pdf remove-multiple-attachments.pdf"},
             {$td->FILE => "remove-multiple-attachments.pdf", $td->EXIT_STATUS => 0});

cleanup();
$td->report($n_tests);
